//let arr = [1, 2, 3, 2, 4]

// for
// for (let i = 0; i < arr.length; i++) {
//     if(arr[i] == 2){
//         continue
//     }
//     console.log(arr[i])
// }

// // forEach
// arr.forEach(function(elem, index, array){
//     if(arr[i] == 2){
//         continue
//     }
//     console.log(elem, index)
// })

// map
// let result = arr.map(function(value){
//     value += 1
//     // console.log(value)
//     return value
// })
// console.log(arr, result)

// filter
// let result = arr.filter(function (value) {
//     // console.log(value)
//     return value == 2
// })
// console.log(arr, result)

// some
// let result = arr.some(function (value) {
//     // console.log(value)
//     return value == 4
// })
// console.log(arr, result)

// every
// let result = arr.every(function (value) {
//     // console.log(value)
//     return value == 2
// })
// console.log(arr, result)

// reduce
// let sum = arr.reduce(function(prev, cur, index, array){
//     return prev + cur
// }, 0)
// console.log(sum)
// let max = arr.reduce(function(prev, cur){
//     return Math.max(prev, cur)
// })
// console.log(max)

// let res = arr.reduce(function(prev, cur){
//     prev.indexOf(cur) == -1 && prev.push(cur)
//     return prev
// }, [])
// console.log(res)

// Array.prototype.foo = function(){
//     console.log('foo')
// }

// for(let index in arr){
//     console.log(index, arr[index])
// }

// // find
// let res = arr.find(function (value) {
//     return value == 8
// })
// console.log(arr, res)

// findIndex
// let res = arr.findIndex(function (value) {
//     return value == 2
// })
// console.log(arr, res)

// for of
// for(let item of arr){
//     console.log(item)
// }

// for(let item of arr.values()){
//     console.log(item)
// }

// for(let item of arr.keys()){
//     console.log(item)
// }

// for(let [index, item] of arr.entries()){
//     console.log(index, item)
// }

// let arr = [1, 2, 3, NaN]
// console.log(arr.indexOf(NaN))

// console.log(NaN == NaN);

// let arr = [1, 2, 3, 4, 5]
//  arr.fill('imooc', 1, 3)
// //arr.fill(0)
// console.log(arr)

// let arrayLike = {
//     0: 'es6',
//     1: 'es7',
//     2: 'es8',
//     length: 3
// }
//  let arr = Array.from(arrayLike)
//  console.log(arr);

// let arr = Array.of(1, 2,{name:1});
// console.log(arr)

// function foo(x, y){
//     y = y || 'world'
//     console.log(x, y)
// }
// // foo('hello', 'imooc')
// foo('hello', 0)

// function foo(x = 5) {
//      let x = 1
//     //const x = 1
// }
// foo()

// function ajax(url, {
//     body = '',
//     method = 'GET',
//     headers = {}
// } = {}){
//     console.log(method)
// }
// ajax('http://www.imooc.com')

// function foo(x =2  , y , z  ){
//     return x+y+z;
// }
// console.log(foo(2,3))

//  let x = 1

// function foo(y = x) {
//     let x = 2
//     console.log(y) // 1
// }
// foo()

// function foo(y = x){
//     let x = 2
//     console.log(y)
// }
// foo()

// function foo(){}
// console.log(foo.name)

// let arr1 = [1, 2, 3]
// let arr2 = [4, 5, 6]
// Array.prototype.push.apply(arr1,arr2)
// //arr1.push(...arr2)
// console.log(arr1)

// let str = 'imooc'
// var arr = [...str]
// console.log(arr)

// rest参数
// function foo(x, y, z) {
//      console.log(arguments)
//     let sum = 0
//     // Array.prototype.forEach.call(arguments, function(item){
//     //     sum += item
//     // })
//     Array.from(arguments).forEach(function(item){
//         sum += item
//     })
//     return sum
// }
// console.log(foo(1, 2))
//  console.log(foo(1, 2, 3))

// let [x, ...y] = [1, 2, 3]
// console.log(x)
// console.log(y)

// console.log(Object.is(2, '2'))
// console.log(Object.is(NaN, NaN))
// console.log(Object.is(+0, -0))
// let obj1 = {  // new Object()
//     name: 'xiecheng',
//     age: 34
// }

// let obj2 = { // new Object()
//     name: 'xiecheng',
//     age: 34
// }
// console.log(obj1 == obj2) // false

// let x = {
//     a: 3,
//     b: 4
// }
// // let y = {...x}
// let y = {
//     c: 5,
//     a: 6
// }
//  Object.assign(y, x)
//  console.log(y)
// //console.log('aa' in x)

// let arr = [1, 2, 3]
// console.log('2' in arr)

// let obj = {
//     name: 'xiecheng',
//     age: 34,
//     school: 'imooc'
// }

// for(let key in obj){
//     console.log(key,obj[key]);
// }

// Object.keys(obj).forEach(key=>{
//     console.log(key,obj[key])
// })

// Object.getOwnPropertyNames(obj).forEach(key=>{
//     console.log(key,obj[key]);
// })

// let target = {
//     a: {
//         b: {
//             c: 1
//         },
//         e: 4,
//         f: 5,
//         g: 6
//     }
// }
// let source = {
//     a: {
//         b: {
//             c: 2
//         },
//         e: 2,
//         f: 3
//     }
// }
// Object.assign(target, source)
// console.log(target)

// class People {
//     constructor(name, age) {
//         this.name = name
//         this.age = age
//         this._sex = -1
//     }
//     // static count = 0
//     get sex() { // 属性
//         if (this._sex === 1) {
//             return 'male'
//         } else if (this._sex === 0) {
//             return 'female'
//         } else {
//             return 'error'
//         }
//     }
//     set sex(val) { // 1:male 0:female
//         if (val === 0 || val === 1) {
//             this._sex = val
//         }
//     }
//     showName() {
//         console.log(this.name)
//     }
//     // 静态方法
//     static getCount() {
//         return 5
//     }
// }
// // 静态属性
// People.count = 9
// console.log(typeof People) // function
// console.log(People.count)

// let p1 = new People('xiecheng', 34)
// console.log(p1)
// p1.sex = 5
// console.log(p1.sex)
// console.log(People.getCount())

// class Coder extends People {
//     constructor(name, age, company) {
//         super(name, age)
//         this.company = company
//     }
//     showCompany() {
//         console.log(this.company)
//     }
// }

// let c1 = new Coder('zhangsan', 25, 'imooc')
// console.log(c1)
// c1.showName()
// c1.showCompany()
// c1.sex = 1
// console.log(c1.sex)
// console.log(Coder.getCount())

// let s1 = Symbol()
// let s2 = Symbol()
// console.log(s1)
// console.log(s2)

// let s1 = Symbol('foo')
// let s2 = Symbol('bar')
// console.log(s1)
// console.log(s2)

// const obj = {
//     name: 'imooc',
//     toString() {
//         return this.name
//     }
// }
// let s = Symbol(obj)
// console.log(s)

// let s = Symbol('foo')
// s.name = 'imooc'
// console.log(s)
// console.log(s.description)

// const sym = Symbol('imooc')
// class User {
//     constructor(name) {
//         this.name = name
//         this[sym] = 'imooc.com'
//     }
//     getName() {
//         return this.name + this[sym]
//     }
// }
// const user = new User('xiecheng')
//  console.log(user.getName())

//  for(let key in user){
//     console.log(key)
// }

// const shapeType = {
//     triangle: Symbol(),
//     circle: Symbol()
// }
// function getArea(shape) {
//     let area = 0
//     switch (shape) {
//         case shapeType.triangle:
//             area = 1
//             break
//         case shapeType.circle:
//             area = 2
//             break
//     }
//     return area
// }
// console.log(getArea(shapeType.triangle))

// let s = new Set([1, 2, 3, 56])
// console.log(s)
// for (let item of s.keys()) {
//     console.log(item)
// }
// for (let item of s.values()) {
//     console.log(item)
// }
// for (let item of s.entries()) {
//     console.log(item[0], item[1])
// }

// // 交集
let arr1 = [1, 2, 3, 4]
let arr2 = [2, 3, 4, 5, 6]
// let s1 = new Set(arr1)
// let s2 = new Set(arr2)
// let result = new Set(arr1.filter(item => s2.has(item)))
// console.log(Array.from(result))

// // 差集
// let arr3 = new Set(arr1.filter(item => !s2.has(item)))
// let arr4 = new Set(arr2.filter(item => !s1.has(item)))
// // console.log(arr3)
// // console.log(arr4)
// console.log([...arr3, ...arr4])

// // ES5
let obj = {}
let newVal = ''
Object.defineProperty(obj, 'name', {
    get(){
        return newVal
    },
    set(val){
        console.log('set')
        // this.name = val
        newVal = val
    }
})

obj.name = 'es'
console.log(obj.name)
